//package com.wzf.greattruth.zookeeper.operator;
//
//import java.util.SortedSet;
//
//import org.apache.commons.lang3.StringUtils;
//import org.apache.zookeeper.KeeperException;
//import org.apache.zookeeper.ZooKeeper;
//import org.apache.zookeeper.data.Stat;
//import org.springframework.util.CollectionUtils;
//
//import com.wzf.greattruth.zookeeper.ZookeeperManager;
//import com.wzf.greattruth.zookeeper.dto.AddLockParam;
//import com.wzf.greattruth.zookeeper.lock.watcher.DistributedWaitLockWatcher;
//import com.wzf.greattruth.zookeeper.node.Node;
//
//public class ZooKeeperAddLockOperator extends ZooKeeperOperator<AddLockParam, Boolean> {
//
//    public ZooKeeperAddLockOperator(ZooKeeper zookeeper, String dir) {
//        super(zookeeper, dir);
//    }
//
//    @Override
//    protected Boolean doOperate(AddLockParam param) throws KeeperException, InterruptedException {
//        ZooKeeper zookeeper = getZookeeper();
//        String dir = getDir();
//
//        if (param == null || StringUtils.isBlank(param.getCurrentNodeId())) {
//            return false;
//        }
//        String currentNodeId = param.getCurrentNodeId();
//        DistributedWaitLockWatcher<?> serialLockWatcher = param.getSerialLockWatcher();
//
//        SortedSet<Node> nodes = ZookeeperManager.getInstance().getChildren(zookeeper, dir);
//        if (CollectionUtils.isEmpty(nodes)) {
//            return false;
//        }
//        Node node = nodes.first();
//        if (currentNodeId.equals(node.getId())) {
//            // 当前node是最小的那个node，那么当前线程上锁成功
//            return true ;
//        }
//        
//        
//        // 如果watcher不为空，那么监控前一个node的create/delete事件
//        if (serialLockWatcher != null) {
//            // 如果不需要设置watcher，那么直接返回true
//            Node currentNode = new Node(dir, currentNodeId);
//            SortedSet<Node> preNodes = nodes.headSet(currentNode);
//            if (preNodes.isEmpty()) {
//                //这种情况应该不会发生，因为除非当前node id是最小的，才会进入这里，此种情况下载之前的判断是就会返回true
//                return true;
//            }
//            
//            Node preNode = preNodes.last();
//            String preNodeId = preNode.getId();
//            String preNodePath = ZookeeperManager.getInstance().getNodePath(dir, preNodeId);
//            Stat stat = zookeeper.exists(preNodePath, serialLockWatcher);
//            if (stat == null) {
//                return false;
//            }
//        }
//        
//        return false;
//    }
//
//}
